home *** CD-ROM | disk | FTP | other *** search
- /*
- * @(#) xswsrv.c 12.1 95/07/05 SCOINC
- */
- /***************************************************************************
- *
- * Copyright (c) 1990-1993 The Santa Cruz Operation, Inc.
- *
- * All rights reserved. No part of this program or publication may be
- * reproduced, transmitted, transcribed, stored in a retrieval system,
- * or translated into any language or computer language, in any form or
- * by any means, electronic, mechanical, magnetic, optical, chemical,
- * biological, or otherwise, without the prior written permission of:
- *
- * The Santa Cruz Operation , Inc. (408) 425-7222
- * 400 Encinal St., Santa Cruz, California 95060 USA
- *
- **************************************************************************/
- /*
- * Modification History
- *
- * S005, 02-Feb-94, rickra
- * Commented out DBD_LSTFILE from mem stuff. Seems like it is
- * no longer in 32V5..
- *
- * S004, 23-Oct-93, rickra
- * Added os_identity function.
- * Also added 32v4 Vs. 32v5 streams
- *
- * S003, 27-May-93, rickra
- * Added disk space gathering...
- * Changed the uid-to-name to use tselect binary tree......
- *
- * S002, 27-May-93, rickra
- * Added security support.
- * Added NMOUNTS
- * Added CALLOUTS
- * Made utmp gathering dynamic....
- * Only read utmp file if it has been changed/modified.
- *
- *
- * S001, 01-Jan-93, rickra
- * Fixed bug in cblocks where it was using current_v_proc instead
- * if using current_v_region....
- * S000, 30-Sep-92, rickra
- * Added copyright and modification history
- * Added support for specify a different booted kernel, other thatn
- * /unix.
- * Added support to be sure that the kernel matches /dev/kmem
- */
- /***************************************************************************
-
- xswsrv.c
-
- This program was written to interface with Xsw, a X application that
- does performance measurements.
-
- *****************************************************************************/
-
- #include "include/unixincs.h"
- #include "include/xswboth.h"
- #include "include/xswclient.h"
- #include "include/xswnlist.h"
- #include "include/nfsstat.h"
- #include "include/sync.h"
- #include <signal.h>
- #include <sys/callo.h>
- #include <sys/pfdat.h>
- #include <sys/mount.h>
- #include <sys/stat.h>
- #include <sys/statfs.h>
- #include <mnttab.h>
- #include <search.h>
-
-
- extern int errno;
- extern char *optarg;
- extern char *defread ();
- extern int defopen ();
-
- int alarm_state = 0;
-
- int FileDescriptor; /* Value returned from "socket()" */
- int count, BytesRecv;
- int TotalPackets = -1;
- int Flags, FromLen;
- struct sockaddr_in SocketID; /* Used to get remote socket info */
- struct sockaddr From;
- struct servent *ServiceNum;
-
- struct stat current_mnt_stat;
- struct stat mnt_stat;
- int current_mnt_entries = 0;
- int first_mnt_stat = 1;
-
- char *kernel = "/unix";
-
- /*
- FILE *tty_debug;
- */
-
- #define DEFAULT "/etc/default/xswsrv"
- struct utsname client_sysuts;
-
- static char *client_str = NULL;
- static int found_client = 0;
-
-
- #define min(a,b) (((a) > (b)) ? (b) : (a))
- #define MTBUFSIZ BUFSIZ
-
- int UTMPS_NUM = 5;
-
- int nutmps = 0;
- int utmps_size = 10;
- struct utmp *utmps;
- struct stat utmp_stat;
- struct stat utmp_stat_old;
-
- char *utmp_file = "/etc/utmp";
-
- int current_v_proc = 0;
- int current_v_file = 0;
- int current_v_inode = 0;
- int current_v_region = 0;
- int current_v_clist = 0;
- int current_v_call = 0;
- int current_v_mount = 0;
-
- int g;
- int *MyBuffer = NULL;
- int inetd = 0;
-
- struct mount_dir_pid_struct
- {
- int used;
- char dir[MTBUFSIZ];
- int pid;
- };
-
-
- #ifdef TESTING
- char test_log[17];
- #endif
-
- int command_line_port = 0;
- int default_file_port = 0;
-
-
- main (argc, argv)
- int argc;
- char *argv[];
- {
-
-
- char c;
- setbuf (stdout, NULL);
-
- while ((c = getopt (argc, argv, "iu:p:s:k:m:")) != EOF)
- {
-
- switch (c)
- {
-
- case 'u':
- kernel = optarg;
- break;
- case 'p':
- sscanf (optarg, "%d", &command_line_port);
- break;
- case 'i':
- inetd++;
- break;
- default:
- break;
- }
- }
-
- /*
- * If inetd is spawning us, do not bind to the port, inetd will do it for
- * us....
- */
-
-
- read_defaults_file ();
-
- if (!inetd)
- CreateBinding (); /* Bind a port to a socket */
-
- RunProgram (); /* Run the application */
- } /* end main */
-
- xswsrv_write (data_pointer, data_size)
- char *data_pointer;
- int data_size;
- {
- int bytes_written;
- int total_written = 0;
- int interrupted = 1;
- char *temp_data_pointer = data_pointer;
-
- while (interrupted == 1)
- {
-
- bytes_written = write (g, temp_data_pointer + total_written, data_size);
-
-
- if ((bytes_written == -1) && (errno == EINTR))
- {
- /*
- * We were interrupted and NO data was written..... Thus re-write the
- * whole thing....
- */
- interrupted = 1;
- }
- else if ((bytes_written != data_size) && (errno == EINTR))
- {
- /*
- * We were interrupted and SOME data was written ... Thus continue the
- * write where we left off....
- */
- interrupted = 1;
-
- total_written += bytes_written;
- /*
- * Some of the data was written...... need to write the rest......
- */
- }
- else
- {
- total_written += bytes_written;
- interrupted = 0;
- }
-
- }
- /*
- * If we lost connection, then lets just exit, but set exit code to 1......
- */
-
- if (bytes_written < 0)
- {
- exit (1);
- }
-
- }
-
- xswsrv_read (data_wanted, data_size)
- int *data_wanted;
- int data_size;
- {
-
- int interrupted = 1;
-
- int bytes_read;
-
-
- /*
- fprintf(stdout,"G = %d, data_wanted = %d, data_size = %d\n",
- g, data_wanted, data_size);
- */
-
-
- while (interrupted == 1)
- {
-
- bytes_read = read (g, data_wanted, data_size);
-
- /*
- * If we had a problem, and the problems is an interruped system call...
- * Then we should try reading again.....
- */
-
- if ((bytes_read == -1) && (errno == EINTR))
- {
- interrupted = 1;
- /*
- fprintf(stdout,"We got interrupted....%d\n",bytes_read);
- */
- }
- else
- {
- /*
- fprintf(stdout,"We did not get interrupted....%d\n",bytes_read);
- */
- interrupted = 0;
- }
-
-
-
- /*
- * If we lost connection, then lets just exit, but set exit code to 1......
- */
-
- if ((bytes_read <= 0) && (interrupted == 0))
- {
- /*
- perror("read:");
- fprintf(stdout,"Bytes read = %d\n", bytes_read);
- fprintf (stdout, "Leaving because of xswsrv read error\n");
- */
- exit (2);
- }
-
- }
-
- }
-
-
- read_defaults_file ()
-
- {
-
- int def_fd;
- char *ptr;
- extern char *strdup ();
-
- if ((def_fd = defopen (DEFAULT)) == 0)
- {
- if ((ptr = defread ("PORT=")) != NULL)
- {
- sscanf (ptr, "%d", &default_file_port);
- }
- if ((ptr = defread ("CLIENTS=")) != NULL)
- {
- client_str = strdup (ptr);
- found_client = 1;
- }
-
-
- close (def_fd); // close if defopen worked.
- }
- }
-
-
- /**********************************************************************
- CreateBinding
- This procedure binds the FileDescriptor to a usable connection.
- This is the most difficult part of the program to understand,
- but once understood, it will be easy. We have created a
- logical socket with the socket function call. However we
- still need to bind the socket's file descriptor to the
- <host.port> format. This is done by setting the values of
- the sockaddr_in structure. For example:
- Sockaddr_in.sin_family=AF_INET This is alway the same.
- Sockaddr_in.sin_port=portnumber This number MUST be
- in a network byte order. functions like
- getservbyname can be used to get the network
- byte order from an entry in /etc/services.
- SocketID,sin_addr.s_addr = INADDR_ANY will bind to
- host to any host, so if a host is considered
- a gateway, it will accept connections from
- both sides of the network. Otherwise if a
- specific name is used, it will bind to only
- one side of the network.
- **********************************************************************/
- CreateBinding ()
- {
-
- int Errval;
- int port;
-
- /* getservbyname only returns NULL, no error codes */
-
- /*
- * command line port over-rides all other defaults....
- */
-
- if (command_line_port != 0)
- port = command_line_port;
- else
- /*
- * /etc/default file
- */
-
- if (default_file_port != 0)
- port = default_file_port;
- else
- /*
- * /etc/services file.... and compiled in default....
- */
-
- if ((ServiceNum = getservbyname (SOCKNAME, PROTOCOL)) == NULL)
- port = XSWPORT;
- else
- port = ntohs (ServiceNum -> s_port);
-
- FileDescriptor = socket (AF_INET, SOCKTYPE, 0); /* select auto configure */
- if (FileDescriptor == -1)
- {
- perror ("Error Creating Socket\n");
- #ifdef TESTING
- gct_writelog (test_log);
- #endif
- exit (3);
- }
-
- /* Set the Values to bind to specific <host.port> entity */
-
- bzero (&SocketID, sizeof (struct sockaddr_in));
-
-
- SocketID.sin_family = AF_INET;/* This values is ALWAYS the same */
- SocketID.sin_port = htons (port); /* Bind to a specific Port */
- /* The port must be in network byte order */
- SocketID.sin_addr.s_addr = INADDR_ANY; /* any host is ok */
-
- Errval = bind (FileDescriptor, (char *) &SocketID, sizeof (SocketID));
- if (Errval)
- {
- perror ("Binding Error");
- #ifdef TESTING
- gct_writelog (test_log);
- #endif
- exit (4);
- }
-
- }
-
- #define swapfunc(X) sysi86(SI86SWPI, X)
-
- typedef struct SwapDirs
- {
- char *sd_name; /* Name of directory to search. */
- DIR *sd_dirp; /* DIR pointer. */
- } SwapDirs_t;
- SwapDirs_t SwapDirs[] =
- {
- {"/dev/dsk", NULL},
- {"/dev", NULL},
- };
-
- #define NbrSwapDirs (sizeof(SwapDirs) / sizeof(SwapDirs_t))
-
- typedef struct dirent dir_t;
-
- char PathBuf[PATHSIZE];
-
- /* Get path name corresponding to a device.
- */
-
-
- char *
- SearchDir (sdp, dev)
- SwapDirs_t *sdp;
- int dev;
- {
- dir_t *dp;
- struct stat statbuf;
-
- while (dp = readdir (sdp -> sd_dirp))
- { /* L001 */
- if (dp -> d_ino == 0)
- continue;
- sprintf (PathBuf, "%s", dp -> d_name);
- if (stat (PathBuf, &statbuf) < 0)
- {
- /*
- fprintf (stderr,
- "Could not stat %s.n",
- PathBuf);
- perror ("swap");
- */
- continue;
- }
- if (statbuf.st_rdev != dev)
- continue;
- if ((statbuf.st_mode & S_IFMT) != S_IFBLK)
- continue;
- strcpy (PathBuf, sdp -> sd_name);
- strcat (PathBuf, "/");
- sprintf (&PathBuf[strlen (PathBuf)], "%s",
- dp -> d_name);
- return (PathBuf);
- }
- return (NULL);
- }
-
- char *
- GetPath (dev)
- int dev;
- {
- int sdndx;
- char *path;
- char *SearchDir ();
-
- for (sdndx = 0; sdndx < NbrSwapDirs; sdndx++)
- {
-
- /*
- * Skip any directories which we * couldn't open.
- */
-
- if (SwapDirs[sdndx].sd_dirp == NULL) /* L001 */
- continue;
-
- /*
- * Change to directory we want to search.
- */
-
- if (chdir (SwapDirs[sdndx].sd_name) < 0)
- {
- /*
- fprintf (stderr, "Couldn't chdir to %s",
- SwapDirs[sdndx].sd_name);
- fprintf (stderr, " - directory not searched.\n");
- perror ("swap");
- */
- SwapDirs[sdndx].sd_dirp = NULL;
- continue;
- }
-
- /*
- * Position at start of directory.
- */
-
- seekdir (SwapDirs[sdndx].sd_dirp, (long) 0); /* L001 */
-
- if (path = SearchDir (&SwapDirs[sdndx], dev))
- return (path);
- }
- return (NULL);
- }
-
-
- /* Initialization for the path search routine.
- */
- void
- InitPath ()
- {
- int i;
-
- for (i = 0; i < NbrSwapDirs; i++)
- {
- SwapDirs[i].sd_dirp =
- opendir (SwapDirs[i].sd_name); /* L001 */
- if (SwapDirs[i].sd_dirp == NULL)
- {
- /*
- fprintf (stderr, "Couldn't open directory %s",
- SwapDirs[i].sd_name);
- fprintf (stderr, " - not being searched.\n");
- perror ("swap");
- */
- }
- }
- }
-
- int
- get_nswap ()
- {
- int swplo;
- int blkcnt;
- swpt_t *st;
- swpi_t *si;
- int i;
- swpt_t swaptab[MSFILES];
- swpi_t swpi;
- char *path;
- int length;
- char *GetPath ();
- int total_pages = 0;
-
- st = swaptab;
- si = &swpi;
- si -> si_cmd = SI_LIST;
- si -> si_buf = (char *) st;
-
- if (swapfunc (si) < 0)
- {
- return (0);
- }
-
- InitPath ();
-
- for (i = 0; i < MSFILES; i++, st++)
- {
- if (st -> st_ucnt == NULL)
- continue;
- path = GetPath (st -> st_dev);
-
- total_pages += st -> st_npgs;
- }
-
- return ((total_pages * NBPP) / 1024);
-
- }
-
-
-
-
-
-
-
- /*+-------------------------------------------------------------------------
- uid to username conversion; thanks for the idea to William LeFebvre
- --------------------------------------------------------------------------*/
-
- #ifdef OLDWAY
-
- #define UID_NAME_HASH_SIZE 127 /* prime */
- #define HASH_EMPTY 32767
- #define HASHIT(i) ((i) % UID_NAME_HASH_SIZE)
-
- #endif
-
- struct uid_name_hash_entry
- {
- ushort uid;
- char name[10];
- };
-
- struct uid_name_hash_entry *uid_root_ptr = NULL;
-
-
- int
- uid_compare (node1, node2)
- struct uid_name_hash_entry *node1, *node2;
-
- {
-
- if ((struct uid_name_hash_entry *) node1 -> uid ==
- (struct uid_name_hash_entry *) node2 -> uid)
- return 0;
-
- if ((struct uid_name_hash_entry *) node1 -> uid <
- (struct uid_name_hash_entry *) node2 -> uid)
- return -1;
-
- if ((struct uid_name_hash_entry *) node1 -> uid >
- (struct uid_name_hash_entry *) node2 -> uid)
- return 1;
-
- }
-
-
- #ifdef OLDWAY
- struct uid_name_hash_entry uid_name_table[UID_NAME_HASH_SIZE];
- int uid_count = 0;
-
- /*+-------------------------------------------------------------------------
- init_uid_name_hash()
- --------------------------------------------------------------------------*/
- void
- init_uid_name_hash ()
- {
- register int ihash = 0;
- register struct uid_name_hash_entry *hashent = uid_name_table;
-
- while (ihash++ < UID_NAME_HASH_SIZE)
- {
- hashent -> uid = HASH_EMPTY;
- hashent++;
- }
- } /* end of init_uid_name_hash */
-
- /*+-------------------------------------------------------------------------
- uid_name_enter(uid,name)
- --------------------------------------------------------------------------*/
- int
- uid_name_enter (uid, name)
- register ushort uid;
- register char *name;
- {
- register ushort table_uid;
- register int hashval;
-
- if (++uid_count >= UID_NAME_HASH_SIZE - 1)
- fprintf (stdout, "too many user names for me to handle");
-
- hashval = HASHIT (uid);
- while ((table_uid = uid_name_table[hashval].uid) != HASH_EMPTY)
- {
- if (table_uid == uid)
- return (hashval);
- hashval = (hashval + 1) % UID_NAME_HASH_SIZE;
- }
-
- uid_name_table[hashval].uid = uid;
- (void) strncpy (uid_name_table[hashval].name, name,
- sizeof (uid_name_table[0].name));
-
- return (hashval);
-
- } /* end of uid_name_enter */
-
- /*+-------------------------------------------------------------------------
- getpwent_and_enter(uid)
- --------------------------------------------------------------------------*/
- getpwent_and_enter (uid)
- register ushort uid;
- {
- register int hashval;
- register struct passwd *pwd;
- char errant[10];
- struct passwd *getpwuid ();
-
- pwd = getpwuid (uid);
- endpwent ();
- if (pwd)
- {
- hashval = uid_name_enter (pwd -> pw_uid, pwd -> pw_name);
- return (hashval);
- }
- (void) sprintf (errant, "%u", uid);
- return (uid_name_enter (uid, errant));
- } /* end of getpwent_and_enter */
-
- #endif
-
- /*+-------------------------------------------------------------------------
- uid_to_name(uid)
- --------------------------------------------------------------------------*/
- char *
- uid_to_name (uid)
- register ushort uid;
- {
-
- struct uid_name_hash_entry *uid_ptr;
- struct uid_name_hash_entry **result_uid_ptr;
-
- register struct passwd *pwd;
- struct passwd *getpwuid ();
-
- uid_ptr = (struct uid_name_hash_entry *)
- calloc (1, sizeof (struct uid_name_hash_entry));
-
- uid_ptr -> uid = uid;
-
- result_uid_ptr = (struct uid_name_hash_entry **)
- tfind ((void *) uid_ptr, (void **) &uid_root_ptr,
- uid_compare);
-
- /*
- * Not found in the tree....
- */
-
- if (result_uid_ptr == NULL)
- {
-
- pwd = getpwuid (uid);
- endpwent ();
-
- uid_ptr -> uid = pwd -> pw_uid;
-
- strcpy (uid_ptr -> name, pwd -> pw_name);
-
- result_uid_ptr = (struct uid_name_hash_entry **)
- tsearch ((char *) uid_ptr,
- (char **) &uid_root_ptr,
- uid_compare);
-
- return (uid_ptr -> name);
-
- }
- else
- {
- free (uid_ptr);
- return ((*result_uid_ptr) -> name);
- }
-
-
-
- #ifdef OLDWAY
-
- register int uid_hash;
- register ushort table_uid;
-
- uid_hash = HASHIT (uid);
- while ((table_uid = uid_name_table[uid_hash].uid) != uid)
- {
- if (table_uid == HASH_EMPTY)
- {
- /* not in hash table */
- uid_hash = getpwent_and_enter (uid);
- break; /* out of while */
- }
- uid_hash = (uid_hash + 1) % UID_NAME_HASH_SIZE;
- }
- return (uid_name_table[uid_hash].name);
-
- #endif
- } /* end of uid_to_name */
-
-
-
-
-
-
-
-
-
- /*+-------------------------------------------------------------------------
- read_utmp()
- --------------------------------------------------------------------------*/
- void
- read_utmp ()
- {
- int utmpfd;
- register struct utmp *tutmp = utmps;
- int i = 0;
- struct utmp *temp_ptr;
- int result = 0;
- static int first_utmp_read = 1;
-
-
- /*
- * Get the time of the utmp file, if it comes back with a bad result,
- * then just read it.....
- */
-
- result = stat (utmp_file, &utmp_stat);
-
- if ((utmp_stat.st_mtime != utmp_stat_old.st_mtime) ||
- (utmp_stat.st_ctime != utmp_stat_old.st_ctime) ||
- (first_utmp_read == 1) || (result != 0))
- {
-
- first_utmp_read = 0;
- utmp_stat_old = utmp_stat;
-
- nutmps = 0;
- if ((utmpfd = open (utmp_file, O_RDONLY, 755)) < 0)
- fprintf (stdout, "/etc/utmp open error");
-
- while (read (utmpfd, (char *) (tutmp++), sizeof (struct utmp)) > 0)
- {
- /*
- * ensure null termination (clobbers 1st byte of ut_line, but we
- * don't use it)
- */
- tutmp -> ut_id[sizeof (tutmp -> ut_id)] = 0;
-
- /*
- * Check to see if we need more space.......If so get some more.....
- */
-
- if (++nutmps == utmps_size)
- {
-
- temp_ptr = (struct utmp *) realloc
- (utmps, (utmps_size + UTMPS_NUM) * sizeof (struct utmp));
-
- /*
- * Check to see if our addresse has changed... If so re-calculate tutmp
- * position.....
- */
- utmps_size += UTMPS_NUM;
-
- if (temp_ptr != utmps)
- {
-
- utmps = temp_ptr;
-
- tutmp = utmps;
-
- for (i = 0; i < nutmps; i++)
- tutmp++;
-
- }
- }
- }
- (void) close (utmpfd);
-
- }
- } /* end of read_utmp */
-
- /*+-------------------------------------------------------------------------
- find_utmp_for_pgrp(pgrp)
- --------------------------------------------------------------------------*/
- struct utmp *
- find_utmp_for_pgrp (pgrp)
- int pgrp;
- {
- struct utmp *tutmp = utmps;
- register int count = nutmps;
-
- while (count--)
- {
- if (tutmp -> ut_pid == pgrp)
- return (tutmp);
- tutmp++;
- }
- return ((struct utmp *) 0);
- } /* end of find_utmp_for_pgrp */
-
- /*+-------------------------------------------------------------------------
- pgrp_to_ttyname(pgrp)
- --------------------------------------------------------------------------*/
- char *
- pgrp_to_ttyname (pgrp)
- int pgrp;
- {
- register itmp;
- struct utmp *tutmp;
-
- if (!(tutmp = find_utmp_for_pgrp (pgrp)))
- {
- read_utmp ();
- tutmp = find_utmp_for_pgrp (pgrp);
- }
- if (!tutmp)
- return ("??");
- else
- {
- itmp = strlen (tutmp -> ut_id);
- return (&tutmp -> ut_id[(itmp >= 2) ? (itmp - 2) : 0]);
- }
- } /* end of pgrp_to_ttyname */
-
- catch_child ()
- {
-
- int wait_stat;
-
- waitpid (0, &wait_stat, WNOHANG);
- signal (SIGCHLD, catch_child);
- /*
- fprintf(stdout,"WIF=%d,EXIT=%d,SIG=%d,TERM=%d,STOP=%d,STOPSIG=%d\n",
- WIFEXITED(wait_stat),
- WEXITSTATUS(wait_stat),
- WIFSIGNALED(wait_stat),
- WTERMSIG(wait_stat),
- WIFSTOPPED(wait_stat),
- WSTOPSIG(wait_stat));
- fprintf(stdout,"in child catcher\n");
- */
-
- }
-
- catch_alarm ()
- {
-
- alarm_state = 1;
- signal (SIGALRM, catch_alarm);
-
- }
-
- void
- get_filesystem_space (g)
- int g;
- {
-
-
- int w;
- int i;
- int k;
-
- char dev[MTBUFSIZ];
- char dir[MTBUFSIZ];
- short flags;
- time_t time;
- MTAB *Mp;
- struct statfs Fs_info;
- char *mnt_file = "/etc/mnttab";
- int do_statfs = 0;
- char *temp_name = NULL;
-
- static struct disk_space_struct *current_disk_space = NULL;
- struct disk_space_struct *temp_ptr;
-
- static struct mount_dir_pid_struct *pid_list = NULL;
- static struct mount_dir_pid_struct *temp_pid_list = NULL;
- static int number_of_pids = 0;
- int found_opening = 0;
-
- int pid;
- int do_fork;
-
- int result;
- int wait_result;
-
- char *char_result;
-
-
- /*
- Open and read /etc/mnttab if it has been modified.....
- */
-
- result = stat (mnt_file, ¤t_mnt_stat);
-
- if ((first_mnt_stat == 1) || (result < 0) ||
- (current_mnt_stat.st_mtime != mnt_stat.st_mtime))
- {
-
- free (current_disk_space);
- mnt_stat.st_mtime = current_mnt_stat.st_mtime;
-
- current_mnt_entries = 0;
- first_mnt_stat = 0;
-
- if ((Mp = openmount (MTAB_ERROR)) == NULL)
- {
- /*
- fprintf (stdout, "Could not open mnttab ....\n");
- */
- xswsrv_write (¤t_mnt_entries, sizeof (int));
- xswsrv_write (current_disk_space,
- current_mnt_entries * sizeof (struct disk_space_struct));
- return;
- }
-
- while (readmount (Mp, dev, MTBUFSIZ, dir, MTBUFSIZ, &flags, &time))
- {
-
- current_mnt_entries++;
-
- if (current_disk_space == NULL)
- {
- current_disk_space = (struct disk_space_struct *)
- malloc (sizeof (struct disk_space_struct));
- }
-
- else
- {
- temp_ptr = (struct disk_space_struct *) realloc
- (current_disk_space,
- (current_mnt_entries) * sizeof (struct disk_space_struct));
-
- if (temp_ptr != current_disk_space)
- {
- current_disk_space = temp_ptr;
- }
- }
-
-
- strcpy (current_disk_space[current_mnt_entries - 1].dev, dev);
- strcpy (current_disk_space[current_mnt_entries - 1].dir, dir);
- /*
- fprintf(stdout,"XSWSRV: LEN = %d \n",
- strlen(current_disk_space[current_mnt_entries - 1].dir));
-
- fprintf(stdout,"XSWSRV: dir = %s\n",
- current_disk_space[current_mnt_entries - 1].dir);
- */
-
- current_disk_space[current_mnt_entries - 1].mt_ro_flg = flags;
- current_disk_space[current_mnt_entries - 1].mt_time = time;
- }
-
- closemount (Mp);
-
-
- }
-
- for (w = 0; w < current_mnt_entries; w++)
-
- {
-
-
- /*
- fprintf(stdout,"DEV = %s...DIR = %s\n",current_disk_space[w].dev,
- current_disk_space[w].dir);
- */
- temp_name = strdup (current_disk_space[w].dev);
-
- char_result = strchr (temp_name, ':');
-
- if (char_result != NULL) /* If we have an NFS filesystem .... */
- {
-
- current_disk_space[w].nfs_filesystem = 1;
-
- /*
- * Check to see if there is currently a child hanging on this filesytem
- * by looking into the pid_list array. If it is there, see if it
- * still alive by using kill(pid,0). If kill says it is there, then the
- * child is still hanging, and we should not fork or statfs.... if it
- * is not alive any more then go ahead and fork again, otherwise set
- * do_statfs = 0
- */
-
- do_fork = 1;
-
- for (i = 0; i < number_of_pids; i++)
- {
-
- if ((pid_list[i].used == 1) &&
- (strcmp (pid_list[i].dir, current_disk_space[w].dir) == 0))
- {
-
- /*
- * If kill says it is not alive, then we must remove the
- * pid from the pid_list....
- */
-
- if (kill (pid_list[i].pid, 0) == 0) /* if the pid is still
- * alive */
- {
- /*
- * Do not fork and do not statfs for this filesystem...
- * It is still hanging.......
- */
- do_fork = 0;
- do_statfs = 0;
- }
- else
- {
- /*
- * Remove this pid from the list, and go ahead and fork
- * again....
- */
- pid_list[i].used = 0;
- do_fork = 1;
-
- }
- }
- }
-
-
- if (do_fork == 1)
- {
- switch (pid = fork ())
- {
-
- int wait_stat;
-
- case 0: /* Child process */
- result = statfs (current_disk_space[w].dir, &Fs_info,
- sizeof (struct statfs), 0);
- exit (0);
- break;
-
- default: /* Parent process */
- /*
- * Save the pid into an array so that we can determine if
- * the child is hanging or not. If it is still hanging on
- * the next interval, as determined by the kill(S), then we
- * should not fork! and we should not statfs!..... becuase
- * we had a timeout on that statfs
- */
-
-
- wait_stat = 0;
- alarm (1); /* Set the alarm for 1 second.... */
- wait_result = waitpid ((pid_t) pid, &wait_stat, 0);
- /*
- fprintf(stdout,"WIF=%d,EXIT=%d,SIG=%d,TERM=%d,STOP=%d,STOPSIG=%d\n",
- WIFEXITED(wait_stat),
- WEXITSTATUS(wait_stat),
- WIFSIGNALED(wait_stat),
- WTERMSIG(wait_stat),
- WIFSTOPPED(wait_stat),
- WSTOPSIG(wait_stat));
- */
-
- alarm (0);
- if (alarm_state == 1) /* Child is hanging.... */
- {
- alarm_state = 0;
-
- /*
- * Add this pid to the list of hanging children...
- */
-
- if (pid_list == NULL)
- {
- number_of_pids = 1;
- pid_list = (struct mount_dir_pid_struct *)
- malloc (sizeof (struct mount_dir_pid_struct));
-
- pid_list[number_of_pids - 1].used = 1;
- pid_list[number_of_pids - 1].pid = pid;
- strcpy (pid_list[number_of_pids - 1].dir,
- current_disk_space[w].dir);
-
- }
- else
- /* See if there is an opening.... */
- {
- for (k = 0; k < number_of_pids; k++)
- {
- if (pid_list[k].used == 0)
- {
- /*
- * Free up current space....
- */
-
- free (pid_list[k].dir);
-
- pid_list[k].used = 1;
- pid_list[k].pid = pid;
- strcpy (pid_list[k].dir,
- current_disk_space[w].dir);
-
- found_opening = 1;
- }
- }
-
- if (found_opening == 0)
- {
- /*
- * Expand pid_list....
- */
- number_of_pids++;
-
- temp_pid_list = (struct mount_dir_pid_struct *) realloc
- (pid_list,
- (number_of_pids) * sizeof (struct mount_dir_pid_struct));
-
- if (temp_pid_list != pid_list)
- {
- pid_list = temp_pid_list;
- }
-
- pid_list[number_of_pids - 1].used = 1;
- pid_list[number_of_pids - 1].pid = pid;
- strcpy (pid_list[number_of_pids - 1].dir,
- current_disk_space[w].dir);
- }
- found_opening = 0;
-
- }
- do_statfs = 0;
- }
- else
- {
- do_statfs = 1;
-
- }
- break;
-
- }
-
- }
-
- }
- else
- {
- do_statfs = 1;
- current_disk_space[w].nfs_filesystem = 0;
- }
-
- free (temp_name);
-
- if (do_statfs == 1)
- {
- result = statfs (current_disk_space[w].dir, &Fs_info,
- sizeof (struct statfs), 0);
- }
-
- /*
- * Save the information into my own data structure....
- */
-
- if (do_statfs == 1)
- {
- current_disk_space[w].problems = 0;
-
- current_disk_space[w].f_fstyp = Fs_info.f_fstyp;
- current_disk_space[w].f_bsize = Fs_info.f_bsize;
- current_disk_space[w].f_frsize = Fs_info.f_frsize;
- current_disk_space[w].f_blocks = Fs_info.f_blocks;
- current_disk_space[w].f_bfree = Fs_info.f_bfree;
- current_disk_space[w].f_files = Fs_info.f_files;
- current_disk_space[w].f_ffree = Fs_info.f_ffree;
- strcpy (current_disk_space[w].f_fname, Fs_info.f_fname);
- strcpy (current_disk_space[w].f_fpack, Fs_info.f_fpack);
-
-
- }
- else
- {
- current_disk_space[w].problems = 1;
-
- current_disk_space[w].f_fstyp = 0;
- current_disk_space[w].f_bsize = 0;
- current_disk_space[w].f_frsize = 0;
- current_disk_space[w].f_blocks = 0;
- current_disk_space[w].f_bfree = 0;
- current_disk_space[w].f_files = 0;
- current_disk_space[w].f_ffree = 0;
-
- }
-
- }
-
-
- xswsrv_write (¤t_mnt_entries, sizeof (int));
-
- xswsrv_write (current_disk_space,
- current_mnt_entries * sizeof (struct disk_space_struct));
-
- }
-
- int
- get_os_version_identity()
-
- {
-
- /*
- * Assum the following about the version:
- *
- * 32v4 = 0
- * 32v5 = 1
- */
-
- if ( x[BX_RRBSIZE].n_value != 0 )
- return 1;
- else
- return 0;
-
- }
-
- void
- get_os_version_data(g)
-
- int g;
- {
- int os_version = 0;
-
- /*
- * If Rbisze is defined in the kernel, then it must be a 32v5 system or
- * later.....
- */
-
- os_version = get_os_version_identity();
-
-
- xswsrv_write (&os_version, sizeof (int));
-
- }
-
-
-
- /****************************************************************************
- get_user_data(g)
- *****************************************************************************/
- void
- get_user_data (g)
- int g;
- {
- int i = 0;
- struct utmp *utmp;
-
-
- setutent ();
- while ((utmp = getutent ()) != NULL)
- {
- if (utmp -> ut_type == USER_PROCESS)
- i++;
- }
-
- xswsrv_write (&i, sizeof (int));
-
- }
-
- /****************************************************************************
- get_freemem_data(g)
- *****************************************************************************/
- void
- get_freemem_data (g)
- int g;
- {
- int freemem_data_pointer;
-
- kread ((caddr_t) & freemem_data_pointer,
- x[BX_FREEMEM].n_value,
- sizeof (freemem_data_pointer));
-
- xswsrv_write (&freemem_data_pointer, sizeof (int));
- }
-
- /****************************************************************************
- get_availsmem_data(g)
- *****************************************************************************/
- void
- get_availsmem_data (g)
- int g;
- {
- int availsmem_data_pointer;
-
- kread ((caddr_t) & availsmem_data_pointer,
- x[BX_AVAILSMEM].n_value,
- sizeof (availsmem_data_pointer));
-
- xswsrv_write (&availsmem_data_pointer, sizeof (availsmem_data_pointer));
- }
-
- /****************************************************************************
- get_boot_time(g)
- *****************************************************************************/
- get_boot_time (g)
- int g;
- {
-
- time_t boot_time;
-
- kread ((caddr_t) & boot_time,
- x[BX_BOOT_TIME].n_value,
- sizeof (time_t));
-
- xswsrv_write (&boot_time, sizeof (time_t));
-
- }
-
- /****************************************************************************
- get_sysinfo_data(g)
- *****************************************************************************/
- void
- get_sysinfo_data (g)
- int g;
- {
- struct sysinfo *sysinfo_data_pointer = NULL;
-
- sysinfo_data_pointer = (struct sysinfo *) malloc (sizeof (struct sysinfo));
-
- kread ((caddr_t) sysinfo_data_pointer,
- x[BX_SYSINFO].n_value,
- sizeof (struct sysinfo));
-
- xswsrv_write (sysinfo_data_pointer, sizeof (struct sysinfo));
-
- free (sysinfo_data_pointer);
-
- }
-
- /****************************************************************************
- get_minfo_data(g)
- *****************************************************************************/
- void
- get_minfo_data (g)
- int g;
- {
- struct minfo *minfo_data_pointer = NULL;
-
- minfo_data_pointer = (struct minfo *) malloc (sizeof (struct minfo));
-
- kread ((caddr_t) minfo_data_pointer,
- x[BX_MINFO].n_value,
- sizeof (struct minfo));
-
- xswsrv_write (minfo_data_pointer, sizeof (struct minfo));
-
- free (minfo_data_pointer);
- }
-
- /****************************************************************************
- get_tune_data(g)
- *****************************************************************************/
- void
- get_tune_data (g)
- int g;
- {
- struct tune *tune_data_pointer = NULL;
-
- tune_data_pointer = (struct tune *) malloc (sizeof (struct tune));
-
- kread ((caddr_t) tune_data_pointer,
- x[BX_TUNE].n_value,
- sizeof (struct tune));
-
- xswsrv_write (tune_data_pointer, sizeof (struct tune));
-
- free (tune_data_pointer);
-
- }
-
- /****************************************************************************
- initialize_var_data()
- *****************************************************************************/
- void
- initialize_var_data ()
- {
-
- struct var *var_data_pointer = NULL;
-
- var_data_pointer = (struct var *) malloc (sizeof (struct var));
-
- kread ((caddr_t) var_data_pointer,
- x[BX_V].n_value,
- sizeof (struct var));
-
- current_v_proc = var_data_pointer -> v_proc;
- current_v_file = var_data_pointer -> v_file;
- current_v_inode = var_data_pointer -> v_inode;
- current_v_region = var_data_pointer -> v_region;
- current_v_clist = var_data_pointer -> v_clist;
- #ifndef XSW32v5
- current_v_call = var_data_pointer -> v_call;
- #endif
- current_v_mount = var_data_pointer -> v_mount;
-
- free (var_data_pointer);
- }
-
- /****************************************************************************
- get_var_data(g)
- *****************************************************************************/
- void
- get_var_data (g)
- int g;
- {
-
- struct var *var_data_pointer = NULL;
-
- var_data_pointer = (struct var *) malloc (sizeof (struct var));
-
- kread ((caddr_t) var_data_pointer,
- x[BX_V].n_value,
- sizeof (struct var));
-
- xswsrv_write (var_data_pointer, sizeof (struct var));
-
- current_v_proc = var_data_pointer -> v_proc;
- current_v_file = var_data_pointer -> v_file;
- current_v_inode = var_data_pointer -> v_inode;
- current_v_region = var_data_pointer -> v_region;
- current_v_clist = var_data_pointer -> v_clist;
- #ifndef XSW32v5
- current_v_call = var_data_pointer -> v_call;
- #endif
- current_v_mount = var_data_pointer -> v_mount;
-
- free (var_data_pointer);
- }
-
-
- /****************************************************************************
- get_bootstring_data(g)
- *****************************************************************************/
- void
- get_bootstring_data (g)
- int g;
- {
-
- char my_bs_bootstring[B_MAXSTRLEN];
-
- int string_size;
-
- char *strings = NULL;
-
- kread ((caddr_t) & string_size,
- x[BX_STRING_SIZE].n_value,
- sizeof (string_size));
-
- strings = (char *) malloc (string_size);
-
- kread ((caddr_t) strings,
- x[BX_STRING].n_value,
- string_size);
-
-
- kread ((caddr_t) & my_bs_bootstring,
- x[BX_BOOTSTRING].n_value,
- sizeof (my_bs_bootstring));
-
- xswsrv_write (&my_bs_bootstring, sizeof (my_bs_bootstring));
-
- xswsrv_write (&string_size, sizeof (int));
- xswsrv_write (strings, string_size);
-
- free (strings);
-
- }
-
-
-
-
- /****************************************************************************
- get_bootinfo_data(g)
- *****************************************************************************/
- void
- get_bootinfo_data (g)
- int g;
- {
- struct bootinfo *bootinfo_data_pointer = NULL;
-
- bootinfo_data_pointer = (struct bootinfo *) malloc (sizeof (struct bootinfo));
-
- kread ((caddr_t) bootinfo_data_pointer,
- x[BX_BOOTINFO].n_value,
- sizeof (struct bootinfo));
-
- xswsrv_write (bootinfo_data_pointer, sizeof (struct bootinfo));
-
- free (bootinfo_data_pointer);
-
- }
-
- /****************************************************************************
- get_maxmem_data(g)
- *****************************************************************************/
- void
- get_maxmem_data (g)
- int g;
- {
- int maxmem_data_pointer;
-
- kread ((caddr_t) & maxmem_data_pointer,
- x[BX_MAXMEM].n_value,
- sizeof (int));
-
- xswsrv_write (&maxmem_data_pointer, sizeof (int));
-
- }
-
- /****************************************************************************
- get_nswap_data(g)
- *****************************************************************************/
- void
- get_nswap_data (g)
- int g;
- {
- int my_nswap;
-
-
- my_nswap = get_nswap ();
-
- xswsrv_write (&my_nswap, sizeof (int));
-
- }
-
- /****************************************************************************
- get_files_data(g)
- *****************************************************************************/
- void
- get_files_data (g)
- int g;
- {
- struct file *files_data_pointer = NULL;
- struct var *var_data_pointer = NULL;
- int file_count;
- int i = 0;
- int config_files;
- /*
- * Experiment: Use read_size to dermine the best read size so that we reduce
- * the over head of reading /dev/mem, but not at the expense of memory.....
- */
-
- int read_size = 1;
-
- config_files = current_v_file;
-
- files_data_pointer = (struct file *)
- malloc (read_size * sizeof (struct file));
-
- file_count = 0;
-
- /*
- * Need to modify this part for read_size variable......
- */
-
- for (i = 0; i < config_files; i++)
- {
- kread ((caddr_t) files_data_pointer,
- x[BX_FILES].n_value + (sizeof (struct file) * i),
- sizeof (struct file));
-
- if (files_data_pointer -> f_count)
- file_count++;
-
- }
-
- free (files_data_pointer);
- xswsrv_write (&file_count, sizeof (int));
- }
-
- /****************************************************************************
- get_indoes_data(g)
- *****************************************************************************/
- void
- get_inodes_data (g)
- int g;
- {
-
- struct var *var_data_pointer = NULL;
- struct inode *inodes_data_pointer = NULL;
- int i = 0;
- int config_inodes;
- int inode_count;
-
- config_inodes = current_v_inode;
-
- inodes_data_pointer = (struct inode *) malloc (sizeof (struct inode));
-
- inode_count = 0;
-
- for (i = 0; i < config_inodes; i++)
- {
- kread ((caddr_t) inodes_data_pointer,
- x[BX_INODE].n_value + (sizeof (struct inode) * i),
- sizeof (struct inode));
-
- if (inodes_data_pointer -> i_count)
- inode_count++;
-
- }
-
- free (inodes_data_pointer);
- xswsrv_write (&inode_count, sizeof (int));
-
- }
-
- /****************************************************************************
- get_procs_data(g)
- *****************************************************************************/
- void
- get_procs_data (g)
- int g;
- {
-
- struct proc *procs_data_pointer = NULL;
- struct var *var_data_pointer = NULL;
-
- int i = 0;
- int config_procs;
- int proc_count;
-
- config_procs = current_v_proc;
-
- procs_data_pointer = (struct proc *) malloc (sizeof (struct proc));
-
- proc_count = 0;
-
- for (i = 0; i < config_procs; i++)
- {
- kread ((caddr_t) procs_data_pointer,
- x[BX_PROCS].n_value + (sizeof (struct proc) * i),
- sizeof (struct proc));
-
- if (procs_data_pointer -> p_stat)
- proc_count++;
-
- }
-
- free (procs_data_pointer);
- xswsrv_write (&proc_count, sizeof (int));
-
- }
-
- /****************************************************************************
- get_regions_data(g)
- *****************************************************************************/
- void
- get_regions_data (g)
- int g;
- {
-
- reg_t *regions_data_pointer = NULL;
- struct var *var_data_pointer = NULL;
-
- int i = 0;
- int config_regions;
- int region_count;
-
- config_regions = current_v_region;
-
- regions_data_pointer = (reg_t *) malloc (sizeof (reg_t));
-
- region_count = 0;
-
- for (i = 0; i < config_regions; i++)
- {
- kread ((caddr_t) regions_data_pointer,
- x[BX_REGION].n_value + (sizeof (reg_t) * i),
- sizeof (reg_t));
-
- if (regions_data_pointer -> r_type != RT_UNUSED)
- region_count++;
-
- }
-
- free (regions_data_pointer);
- xswsrv_write (®ion_count, sizeof (int));
-
- }
-
- /*+-------------------------------------------------------------------------
- get_cblocks_data()
- --------------------------------------------------------------------------*/
- void
- get_cblocks_data (g)
- int g;
- {
-
- struct var *var_data_pointer = NULL;
- struct cblock *cfree, *tmp;
- static struct cblock *addr = (struct cblock *) 0;
- struct chead cfreelist;
-
- int j, i, index;
- static int count[2];
-
- int myclist = 0;
- int config_clist = 0;
-
- config_clist = current_v_clist;
-
- cfree = (struct cblock *) malloc (sizeof (*cfree) * config_clist);
-
- if (cfree == NULL)
- perror ("cblocks: malloc");
-
- if (addr == (struct cblock *) 0)
- kread ((caddr_t) & addr, x[BX_CBLOCKS].n_value, sizeof (struct cblock *));
-
- for (j = 0; j < 2; j++)
- {
- kread ((caddr_t) (char *) cfree, (int) addr, sizeof (*cfree) * config_clist);
- kread ((caddr_t) (char *) &cfreelist, x[BX_CFREELIST].n_value,
- sizeof (struct chead));
-
- index = cfreelist.c_next - addr;
-
- tmp = &cfree[index];
- count[j] = 0;
- for (i = 0; tmp -> c_next && i < config_clist; i++)
- {
- index = tmp -> c_next - addr;
- count[j]++;
- tmp = &cfree[index];
-
- }
- }
-
- free (cfree);
-
- if ((abs (count[0] - count[1])) > (config_clist * 10) / 100)
- myclist = (config_clist - ((count[0] > count[1]) ? count[0] : count[1]));
- else
- myclist = (config_clist - (min (count[0], count[1])));
-
-
- xswsrv_write (&myclist, sizeof (int));
-
- }
-
- /*+-------------------------------------------------------------------------
- get_call_data()
- --------------------------------------------------------------------------*/
- void
- get_call_data (g)
- int g;
- {
-
- struct callo *my_callout = NULL;
-
- int number_of_callout;
- int callout_count = 0;
- int i = 0;
-
- number_of_callout = current_v_call;
-
- my_callout = (struct callo *)
- calloc (number_of_callout, sizeof (struct callo));
-
- kread ((caddr_t) my_callout,
- x[BX_CALLOUT].n_value,
- sizeof (struct callo) * number_of_callout);
-
- for (i = 0; i < number_of_callout; i++)
- {
- if (my_callout[i].c_func != NULL)
- callout_count++;
- }
-
- free (my_callout);
-
- xswsrv_write (&callout_count, sizeof (int));
-
-
- }
-
- /*+-------------------------------------------------------------------------
- get_mount_data()
- --------------------------------------------------------------------------*/
- void
- get_mount_data (g)
- int g;
- {
-
- struct mount *my_mount = NULL;
-
- int number_of_mounts;
- int mount_count = 0;
- int i = 0;
-
- number_of_mounts = current_v_mount;
-
- my_mount = (struct mount *)
- calloc (number_of_mounts, sizeof (struct mount));
-
- kread ((caddr_t) my_mount,
- x[BX_MOUNT].n_value,
- sizeof (struct mount) * number_of_mounts);
-
- for (i = 0; i < number_of_mounts; i++)
- {
- if (my_mount[i].m_flags != 0)
- mount_count++;
- }
-
- free (my_mount);
-
- xswsrv_write (&mount_count, sizeof (int));
-
-
- }
-
- /****************************************************************************
- get_streams_data(g)
- *****************************************************************************/
- void
- get_streams_data (g)
- int g;
- {
-
-
- struct strstat *mystreams;
- int mynmblock;
-
- struct pagestat pagest;
- uint *rbsizep32v5 = NULL;
- ushort *rbsizep32v4 = NULL;
-
- mystreams = (struct strstat *) malloc (sizeof (struct strstat));
-
- kread ((caddr_t) mystreams,
- x[BX_STREAMS].n_value,
- sizeof (struct strstat));
-
- kread ((caddr_t) & mynmblock,
- x[BX_NMBLOCK].n_value,
- sizeof (mynmblock));
-
-
- xswsrv_write (mystreams, sizeof (struct strstat));
- xswsrv_write (&mynmblock, sizeof (int));
-
-
- /*
- * If this is a 32v5 system, then we need to send some more data....
- */
-
- if ( get_os_version_identity() == 1 )
- {
-
- kread ((caddr_t) & pagest,
- x[BX_PAGEST].n_value,
- sizeof (struct pagestat));
-
- rbsizep32v5 = (uint *)malloc(15 * sizeof(uint));
-
- kread ((caddr_t) rbsizep32v5,
- x[BX_RRBSIZE].n_value,
- 15 * sizeof(uint));
-
- xswsrv_write (&pagest, sizeof (struct pagestat));
- xswsrv_write (rbsizep32v5 ,15 * sizeof(uint));
- } else
- if ( get_os_version_identity() == 0 )
- {
- rbsizep32v4 = (ushort *)malloc(9 * sizeof(ushort));
-
- kread ((caddr_t) rbsizep32v4,
- x[BX_RBSIZE].n_value,
- 9 * sizeof(ushort));
-
- xswsrv_write (rbsizep32v4 ,9 * sizeof(ushort));
- }
-
-
-
-
- free (mystreams);
-
- if (rbsizep32v5 != NULL)
- free (rbsizep32v5);
- if (rbsizep32v4 != NULL)
- free (rbsizep32v4);
-
- }
-
- /****************************************************************************
- get_nfs_data(g)
- *****************************************************************************/
- void
- get_nfs_data (g)
- int g;
- {
-
- kread ((caddr_t) & rcstat, x[BX_RCSTAT].n_value, sizeof (rcstat));
- kread ((caddr_t) & clstat, x[BX_CLSTAT].n_value, sizeof (clstat));
- kread ((caddr_t) & rsstat, x[BX_RSSTAT].n_value, sizeof (rsstat));
- kread ((caddr_t) & svstat, x[BX_SVSTAT].n_value, sizeof (svstat));
-
- xswsrv_write (&rcstat, sizeof (rcstat));
- xswsrv_write (&rsstat, sizeof (rsstat));
- xswsrv_write (&clstat, sizeof (clstat));
- xswsrv_write (&svstat, sizeof (svstat));
-
-
- }
-
- /****************************************************************************
- get_nfs_available(g)
- *****************************************************************************/
- void
- get_nfs_available (g)
- int g;
- {
-
- int nfs_available = 0;
-
- if (x[BX_RCSTAT].n_value != 0)
- {
- nfs_available = 1;
- }
-
- xswsrv_write (&nfs_available, sizeof (nfs_available));
-
-
- }
-
- /****************************************************************************
- get_floppy_disk_available(g)
- *****************************************************************************/
- void
- get_floppy_disk_available (g)
- {
-
- int floppy_available = 0;
-
- if (x[BX_FLOPPY_DISK_STATS].n_value != 0)
- {
- floppy_available = 1;
- }
-
- xswsrv_write (&floppy_available, sizeof (floppy_available));
-
-
- }
-
- /****************************************************************************
- get_scsi_disk_available(g)
- *****************************************************************************/
- void
- get_scsi_disk_available (g)
- {
-
- int scsi_disk_available = 0;
-
- if (x[BX_SCSI_DISK_STATS].n_value != 0)
- {
- scsi_disk_available = 1;
- }
-
- xswsrv_write (&scsi_disk_available, sizeof (scsi_disk_available));
-
-
- }
-
- /****************************************************************************
- get_scsi_tape_available(g)
- *****************************************************************************/
- void
- get_scsi_tape_available (g)
- {
-
- int scsi_tape_available = 0;
-
- if (x[BX_SCSI_TAPE_STATS].n_value != 0)
- {
- scsi_tape_available = 1;
- }
-
- xswsrv_write (&scsi_tape_available, sizeof (scsi_tape_available));
-
-
- }
-
- /****************************************************************************
- get_scsi_rom_available(g)
- *****************************************************************************/
- void
- get_scsi_rom_available (g)
- {
-
- int scsi_rom_available = 0;
-
- if (x[BX_SCSI_ROM_STATS].n_value != 0)
- {
- scsi_rom_available = 1;
- }
-
- xswsrv_write (&scsi_rom_available, sizeof (scsi_rom_available));
-
- }
-
- /****************************************************************************
- get_cart_tape_available(g)
- *****************************************************************************/
- void
- get_cart_tape_available (g)
- {
-
- int cart_tape_available = 0;
-
- if (x[BX_CART_TAPE_STATS].n_value != 0)
- {
- cart_tape_available = 1;
- }
-
- xswsrv_write (&cart_tape_available, sizeof (cart_tape_available));
-
- }
-
- /****************************************************************************
- get_esdi_disk_available(g)
- *****************************************************************************/
- void
- get_esdi_disk_available (g)
- {
-
- int esdi_disk_available = 0;
-
- if (x[BX_ESDI_DISK_STATS].n_value != 0)
- {
- esdi_disk_available = 1;
- }
-
- xswsrv_write (&esdi_disk_available, sizeof (esdi_disk_available));
-
- }
-
- /****************************************************************************
- get_wd_disk_available(g)
- *****************************************************************************/
- void
- get_wd_disk_available (g)
- {
-
- int wd_disk_available = 0;
-
- if (x[BX_WD_DISK_STATS].n_value != 0)
- {
- wd_disk_available = 1;
- }
-
- xswsrv_write (&wd_disk_available, sizeof (wd_disk_available));
-
- }
-
-
-
-
- /****************************************************************************
- get_floppy_disk_data(g)
- *****************************************************************************/
- void
- get_floppy_disk_data (g)
- int g;
- {
-
- struct iotime floppy_disk_stats[4];
-
-
- kread ((caddr_t) & floppy_disk_stats,
- x[BX_FLOPPY_DISK_STATS].n_value,
- sizeof (floppy_disk_stats));
-
- xswsrv_write (&floppy_disk_stats, sizeof (floppy_disk_stats));
- }
-
- /****************************************************************************
- get_scsi_disk_data(g)
- *****************************************************************************/
- void
- get_scsi_disk_data (g)
- int g;
- {
-
- struct iotime Sdsk_stats[4];
-
- kread ((caddr_t) & Sdsk_stats,
- x[BX_SCSI_DISK_STATS].n_value,
- sizeof (Sdsk_stats));
-
- xswsrv_write (&Sdsk_stats, sizeof (Sdsk_stats));
- }
-
- /****************************************************************************
- get_scsi_tape_data(g)
- *****************************************************************************/
- void
- get_scsi_tape_data (g)
- int g;
- {
-
- struct iotime Stp_stats[4];
-
- kread ((caddr_t) & Stp_stats,
- x[BX_SCSI_TAPE_STATS].n_value,
- sizeof (Stp_stats));
-
- xswsrv_write (&Stp_stats, sizeof (Stp_stats));
- }
-
-
- /****************************************************************************
- get_scsi_rom_data(g)
- *****************************************************************************/
- void
- get_scsi_rom_data (g)
- int g;
- {
-
- struct iotime Srom_stats[4];
-
- kread ((caddr_t) & Srom_stats,
- x[BX_SCSI_ROM_STATS].n_value,
- sizeof (Srom_stats));
-
- xswsrv_write (&Srom_stats, sizeof (Srom_stats));
- }
-
- /****************************************************************************
- get_cart_tape_data(g)
- *****************************************************************************/
- void
- get_cart_tape_data (g)
- int g;
- {
-
- struct iotime cart_tape_stats[4];
-
- kread ((caddr_t) & cart_tape_stats,
- x[BX_CART_TAPE_STATS].n_value,
- sizeof (cart_tape_stats));
-
- xswsrv_write (&cart_tape_stats, sizeof (cart_tape_stats));
- }
-
- /****************************************************************************
- get_esdi_disk_data(g)
- *****************************************************************************/
- void
- get_esdi_disk_data (g)
- int g;
- {
-
- struct iotime esdi_disk_stats[4];
-
- kread ((caddr_t) & esdi_disk_stats,
- x[BX_ESDI_DISK_STATS].n_value,
- sizeof (esdi_disk_stats));
-
- xswsrv_write (&esdi_disk_stats, sizeof (esdi_disk_stats));
- }
-
- /****************************************************************************
- get_wd_disk_data(g)
- *****************************************************************************/
- void
- get_wd_disk_data (g)
- int g;
- {
-
- struct iotime wd_disk_stats[4];
-
- kread ((caddr_t) & wd_disk_stats,
- x[BX_WD_DISK_STATS].n_value,
- sizeof (wd_disk_stats));
-
- xswsrv_write (&wd_disk_stats, sizeof (wd_disk_stats));
- }
-
-
- /****************************************************************************
- get_process_data(g)
- *****************************************************************************/
- void
- get_process_data (g)
- int g;
- {
-
- struct proc *begining_ps_proc_data_pointer = NULL;
- struct proc *ps_proc_data_pointer = NULL;
-
- struct my_proc_struct *my_proc_data_pointer = NULL;
- struct my_proc_struct *begining_my_proc = NULL;
-
- struct user tuser;
- struct my_user_struct *start_my_user = (struct my_user_struct *) 0;
- struct my_user_struct *my_user = (struct my_user_struct *) 0;
-
- int i = 0;
- int temp = 0;
- int got_data;
- int slots_in_use = 0;
-
- struct var *var_data_pointer = NULL;
-
- var_data_pointer = (struct var *) malloc (sizeof (struct var));
-
- kread ((caddr_t) var_data_pointer,
- x[BX_V].n_value,
- sizeof (struct var));
-
- /*
- * Get the number of slots in use in the process table, and only read
- * up to and including the last slot in use.....
- */
-
- slots_in_use = (unsigned) (var_data_pointer -> ve_proc -
- x[BX_PROCS].n_value) / sizeof (struct proc);
-
-
-
- /*
- * Get enough space to read in data....
- */
-
- ps_proc_data_pointer =
- (struct proc *) malloc (sizeof (struct proc) * slots_in_use);
-
- my_proc_data_pointer = (struct my_proc_struct *)
- malloc (sizeof (struct my_proc_struct) * slots_in_use);
-
- my_user = (struct my_user_struct *)
- malloc (sizeof (struct my_user_struct) * slots_in_use);
-
- /*
- * Save the start of the pointers....
- */
-
-
- kread ((caddr_t) ps_proc_data_pointer,
- (daddr_t) x[BX_PROCS].n_value,
- sizeof (struct proc) * slots_in_use);
-
- begining_my_proc = my_proc_data_pointer;
- begining_ps_proc_data_pointer = ps_proc_data_pointer;
-
- start_my_user = my_user;
-
- for (i = 0; i < slots_in_use; i++)
- {
-
-
- /*
- * If this slot is in use, then get the user data....
- */
-
- if (ps_proc_data_pointer -> p_stat)
- {
- temp = sysi86 (RDUBLK, ps_proc_data_pointer -> p_pid,
- (char *) &tuser, sizeof (struct user));
-
- if (temp != -1)
- {
- start_my_user -> p_pid = ps_proc_data_pointer -> p_pid;
- start_my_user -> u_tsize = tuser.u_tsize;
- start_my_user -> u_dsize = tuser.u_dsize;
- start_my_user -> u_ssize = tuser.u_ssize;
- start_my_user -> u_utime = tuser.u_utime;
- start_my_user -> u_stime = tuser.u_stime;
- strcpy (start_my_user -> u_psargs, tuser.u_psargs);
- strcpy (start_my_user -> u_comm, tuser.u_comm);
- start_my_user -> u_ior = abs (tuser.u_ior);
- start_my_user -> u_iow = abs (tuser.u_iow);
- start_my_user -> u_iosw = abs (tuser.u_iosw);
- start_my_user -> u_ioch = abs (tuser.u_ioch);
-
- start_my_user++;
- }
- }
-
- my_proc_data_pointer -> p_stat = ps_proc_data_pointer -> p_stat;
- my_proc_data_pointer -> p_pid = ps_proc_data_pointer -> p_pid;
- my_proc_data_pointer -> p_flag = ps_proc_data_pointer -> p_flag;
- my_proc_data_pointer -> p_usize = ps_proc_data_pointer -> p_usize;
- my_proc_data_pointer -> p_uid = ps_proc_data_pointer -> p_uid;
- my_proc_data_pointer -> p_suid = ps_proc_data_pointer -> p_suid;
- my_proc_data_pointer -> p_cpu = ps_proc_data_pointer -> p_cpu;
- my_proc_data_pointer -> p_pri = ps_proc_data_pointer -> p_pri;
- my_proc_data_pointer -> p_nice = ps_proc_data_pointer -> p_nice;
- my_proc_data_pointer -> p_pgrp = ps_proc_data_pointer -> p_pgrp;
-
- strncpy (my_proc_data_pointer -> tty,
- pgrp_to_ttyname (my_proc_data_pointer -> p_pgrp), 3);
-
- strncpy (my_proc_data_pointer -> name,
- uid_to_name (my_proc_data_pointer -> p_uid), 10);
-
- my_proc_data_pointer -> name[9] = '\0';
-
- my_proc_data_pointer++;
- ps_proc_data_pointer++;
- }
-
- /*
- * Send the last slot used....
- */
-
- xswsrv_write (&slots_in_use, sizeof (slots_in_use));
-
- xswsrv_read (&got_data, sizeof (int));
-
- /*
- * Send the process table up to and including the last slot used....
- */
-
- xswsrv_write (begining_my_proc,
- sizeof (struct my_proc_struct) * slots_in_use);
-
- xswsrv_read (&got_data, sizeof (int));
-
- /*
- * Send the user table per process....
- */
-
- xswsrv_write (my_user, sizeof (struct my_user_struct) * slots_in_use);
-
- free (begining_my_proc);
- free (begining_ps_proc_data_pointer);
- free (my_user);
- free (var_data_pointer);
-
- }
-
- // begin memory rework for 32v5 (5.0)
- //
-
- typedef struct _dbdcounts { int none, swap, file, lstfile,
- swap_core, file_core, lstfile_core, zero, fill, proc;
- } dbdinfo;
-
- void prdbd(dbd_t dbd, pde_t pde, dbdinfo *d)
- {
- switch (dbd.dbd_type)
- {
- case DBD_NONE:
- d->none++;
- break;
- case DBD_SWAP:
- d->swap++;
- if (pde.pgm.pg_pres)
- d->swap_core++;
- break;
- case DBD_DZERO:
- d->zero++;
- break;
- case DBD_FILE:
- d->file++;
- if (pde.pgm.pg_pres)
- d->file_core++;
- break;
- case DBD_DFILL:
- d->fill++;
- break;
- case DBD_PROC:
- d->proc++;
- break;
- default:
- break;
- }
- }
-
- static unsigned long pfdat = 0;
- static struct mfmap mfmap[B_MAXARGS];
- static int mfmax;
- int
- pfntopfdix(uint pfn)
- {
- register struct mfmap *mp;
-
- if (!pfdat) {
- kread((caddr_t) &pfdat, x[BX_PFDAT].n_value, sizeof pfdat);
- kread((caddr_t) &mfmap, x[BX_MFMAP].n_value, sizeof mfmap);
- kread((caddr_t) &mfmax, x[BX_MFMAX].n_value, sizeof mfmax);
- }
- for (mp = &mfmap[mfmax-1]; mp >= mfmap; mp--)
- if (mp->base <= pfn && pfn < mp->base + mp->extent)
- return (mp->pf - (struct pfdat *)pfdat)
- + (pfn - mp->base);
- return -1;
- }
-
-
- void prpde(pde_t pde, dbdinfo *d)
- {
- dbd_t dbd;
- int pfdix;
-
- if (pg_isvalid(&pde) || pde.pgd.dbd_type == DBD_PAGE) { /* L014 */
- pfdix = pfntopfdix(pde.pgm.pg_pfn);
- if (pfdix == -1)
- {
- *(uint*)&dbd = NV_NW_NONE;
- }
- else {
- kread((caddr_t) &dbd, pfdat+pfdix*sizeof(struct pfdat),
- sizeof dbd);
- }
- }
- else { /* L014 v */
- dbd = pde.pgd;
- }
- prdbd(dbd,pde,d);
- }
-
-
- void
- eachpage( unsigned long tab_addr,
- int count,
- int all,
- unsigned long base,
- int first,
- int shift,
- const char *head,
- dbdinfo *d)
- {
- int i;
- pde_t pde[NPGPT];
-
- // for some reason this must be mread not kread !!!
- mread((caddr_t) &pde, (unsigned long)tab_addr, sizeof (pde));
-
- for (i=first; count; i++, count--) {
- if (i < 0 || i >= NPGPT) {
- fprintf(stderr,"%d out of range within MMU-table", i);
- break;
- }
- if (all || pg_isvalid(pde+i) /* L014 */
- || pde[i].pgd.dbd_type == DBD_PAGE) { /* L014 */
- prpde(pde[i],d);
- }
- }
- }
-
-
- // called once for each region
- // for each region, loop thru each page table
- eachregion( long *r_list, long r_pgsz, long r_segoff, dbdinfo *d)
- {
- // read the pde from this region
- long segoff, seglim, pglim, i, base=0;
- pde_t pde;
-
- base = - ctob(r_segoff); /* so offsets shown start from zero */
- seglim = ctos((segoff = r_segoff) + r_pgsz);
-
- for (i = 0; i < seglim; segoff = 0, i++, r_list++) {
- pglim = r_segoff + r_pgsz - stoc(i);
- if (pglim > NPGPT)
- pglim = NPGPT;
- pglim -= segoff;
-
- // get the page table pointer
- kread((caddr_t) &pde, (daddr_t)r_list, sizeof(pde));
-
- prpde(pde,d);
- if (pg_isvalid(&pde) || pde.pgd.dbd_type == DBD_PAGE) {
- eachpage( ctob(pde.pgm.pg_pfn),
- pglim, 1, base, segoff, PNUMSHFT, " OFFSET",d);
- }
- base += ctob(stoc(1));
- }
-
- }
- // called once for each proc
- // do a nested for loop:
- // for each region
- //
- eachproc(struct proc *pp,
- int *private_mem,
- int *shared_mem,
- int *weighted,
- int *virtual_size,
- dbdinfo *d
- )
- {
- struct pregion pregbuf;
- struct region rbuf;
- pregbuf.p_next = pp->p_region;
- while (pregbuf.p_next) {
- kread ((caddr_t) &pregbuf, pregbuf.p_next, sizeof pregbuf);
- kread ((caddr_t) &rbuf, pregbuf.p_reg, sizeof rbuf);
- if ( rbuf.r_refcnt!=0 && rbuf.r_pgsz && rbuf.r_list )
- {
- eachregion((long *)rbuf.r_list,rbuf.r_pgsz,
- rbuf.r_segoff, d);
-
- switch (rbuf.r_type) {
- case RT_UNUSED:
- case RT_MAPFILE:
- case RT_PRIVATE:
- *private_mem = *private_mem + rbuf.r_nvalid;
- break;
- case RT_STEXT:
- case RT_SHMEM:
- case RT_VM86:
- *shared_mem = *shared_mem + rbuf.r_nvalid;
- if (rbuf.r_refcnt != 0)
- *weighted = *weighted +
- (rbuf.r_nvalid / rbuf.r_refcnt);
- break;
- default:
- break;
- /*
- * fprintf(stderr,"Got a hole in our logic!\n");
- */
- }
- *virtual_size = *virtual_size + rbuf.r_pgsz;
- }
- }
- }
- /****************************************************************************
- get_mem_process_data(g)
- *****************************************************************************/
- #ifndef RG_SWAP
- #define RG_SWAP RG_SWAPOUT
- #endif
-
- void
- get_mem_process_data (g)
- int g;
- {
-
- register int iproc;
-
- struct memory_usage *dynamic_memory_pointer = NULL;
- struct region myregion;
- struct proc *ps_proc_data_pointer = NULL;
- struct proc *mytproc = NULL;
- struct proc **pprocs = (struct proc **) 0;
- preg_t *mypregion = NULL;
- preg_t *start_mypregion = NULL;
- struct user tuser;
- struct memory_usage current_process;
-
-
- int noseg;
- unsigned nopg;
- long *dbd_addr;
- int isstack;
- int first;
- int dbdfirst;
- int k, l;
- dbd_t dbd[NPGPT];
- pde_t pde[NPGPT];
-
- int dlist;
- int list;
-
- dbdinfo d;
- #if 0
- int none;
- int swap;
- int file;
- int lstfile;
-
- int swap_core;
- int file_core;
- int lstfile_core;
-
- int zero;
- int fill;
- int iomap;
- int window;
- #endif
-
- int current_mem_procs = 0;
- int num_active_process = 0;
- int num_regions = 0;
-
- int virtual_size = 0;
- int private_mem = 0;
- int shared_mem = 0;
- int weighted = 0;
-
- int got_data = 0;
- int slots_in_use = 0;
-
- int j;
- int temp;
- struct var *var_data_pointer = NULL;
-
- var_data_pointer = (struct var *) malloc (sizeof (struct var));
-
- kread ((caddr_t) var_data_pointer,
- x[BX_V].n_value,
- sizeof (struct var));
-
- /*
- * Get the number of slots in use in the process table, and only read
- * slots that are in use.....
- */
-
- slots_in_use = (unsigned) (var_data_pointer -> ve_proc -
- x[BX_PROCS].n_value) / sizeof (struct proc);
-
-
- num_active_process = 0;
- current_mem_procs = 0;
-
-
- ps_proc_data_pointer =
- (struct proc *) malloc (sizeof (struct proc) * slots_in_use);
- pprocs = (struct proc **) malloc (sizeof (struct proc *) * slots_in_use);
-
-
- kread ((caddr_t) ps_proc_data_pointer, x[BX_PROCS].n_value,
- sizeof (struct proc) * slots_in_use);
-
- dynamic_memory_pointer =
- (struct memory_usage *) malloc (sizeof (struct memory_usage) * slots_in_use);
-
-
- for (iproc = 0; iproc < slots_in_use; iproc++)
- {
-
- virtual_size = 0;
- private_mem = 0;
- shared_mem = 0;
- weighted = 0;
- num_regions = 0;
-
- d.none = 0;
- d.swap = 0;
- d.file = 0;
- d.lstfile = 0;
- d.swap_core = 0;
- d.file_core = 0;
- d.lstfile_core = 0;
- d.zero = 0;
- d.fill = 0;
- d.proc = 0;
-
-
- mytproc = pprocs[iproc] = (ps_proc_data_pointer + iproc);
-
- if (mytproc -> p_stat)
- {
-
- num_active_process++;
-
- eachproc(mytproc, &private_mem, &shared_mem,
- &weighted, &virtual_size, &d);
-
- {
-
- temp = sysi86 (RDUBLK, mytproc -> p_pid,
- (char *) &tuser, sizeof (struct user));
-
- strncpy (current_process.name,
- uid_to_name (mytproc -> p_uid), 10);
-
- current_process.name[9] = '\0';
-
- current_process.p_pid = mytproc -> p_pid;
- current_process.p_suid = mytproc -> p_suid;
- current_process.p_uid = mytproc -> p_uid;
- current_process.virtual = virtual_size;
- current_process.private = private_mem;
- current_process.shared = shared_mem;
- current_process.weighted = weighted;
- current_process.total = private_mem + weighted;
- current_process.none = d.none;
- current_process.swap = d.swap;
- current_process.file = d.file;
- current_process.lstfile = d.lstfile;
- current_process.swap_core = d.swap_core;
- current_process.file_core = d.file_core;
- current_process.lstfile_core = d.lstfile_core;
- current_process.zero = d.zero;
- current_process.fill = d.fill;
- current_process.proc = d.proc;
-
- strcpy (current_process.u_psargs, tuser.u_psargs);
-
- dynamic_memory_pointer[current_mem_procs] = current_process;
-
- current_mem_procs++;
-
- }
-
- }
-
-
- }
-
- xswsrv_write (¤t_mem_procs, sizeof (int));
-
- xswsrv_read (&got_data, sizeof (int));
-
- xswsrv_write (dynamic_memory_pointer,
- sizeof (process_memory) * current_mem_procs);
-
- free (dynamic_memory_pointer);
- free (ps_proc_data_pointer);
- free (pprocs);
- free (var_data_pointer);
-
- }
-
- #ifdef kernel_swap_mem
- /****************************************************************************
- get_kernel_read_data(g)
- *****************************************************************************/
- void
- get_kernel_read_data (g)
- int g;
- {
-
- caddr_t *addresse_data_pointer;
- struct netread *kernel_read_data_pointer;
-
- kernel_read_data_pointer = (struct netread *) malloc (sizeof (struct netread));
-
- xswsrv_read (kernel_read_data_pointer, sizeof (struct netread));
-
- addresse_data_pointer = (caddr_t *) malloc (kernel_read_data_pointer -> length);
-
- kread ((caddr_t) addresse_data_pointer,
- (daddr_t) kernel_read_data_pointer -> addresse,
- kernel_read_data_pointer -> length);
-
- xswsrv_write (addresse_data_pointer, kernel_read_data_pointer -> length);
-
- free (kernel_read_data_pointer);
- free (addresse_data_pointer);
-
- }
-
- /****************************************************************************
- get_mem_read_data(g)
- *****************************************************************************/
- void
- get_mem_read_data (g)
- int g;
- {
- caddr_t *addresse_data_pointer;
- struct netread *kernel_read_data_pointer;
-
- kernel_read_data_pointer = (struct netread *) malloc (sizeof (struct netread));
-
- xswsrv_read (kernel_read_data_pointer, sizeof (struct netread));
-
- addresse_data_pointer = (caddr_t *) malloc (kernel_read_data_pointer -> length);
-
- mread ((caddr_t) addresse_data_pointer,
- (daddr_t) kernel_read_data_pointer -> addresse,
- kernel_read_data_pointer -> length);
-
- xswsrv_write (addresse_data_pointer, kernel_read_data_pointer -> length);
-
- free (kernel_read_data_pointer);
- free (addresse_data_pointer);
-
- }
-
- /****************************************************************************
- get_swap_read_data(g)
- *****************************************************************************/
- void
- get_swap_read_data (g)
- int g;
- {
- caddr_t *addresse_data_pointer;
- struct netread *kernel_read_data_pointer;
-
- kernel_read_data_pointer = (struct netread *) malloc (sizeof (struct netread));
-
- xswsrv_read (kernel_read_data_pointer, sizeof (struct netread));
-
- addresse_data_pointer = (caddr_t *) malloc (kernel_read_data_pointer -> length);
-
- sread ((caddr_t) addresse_data_pointer,
- (daddr_t) kernel_read_data_pointer -> addresse,
- kernel_read_data_pointer -> length);
-
- xswsrv_write (addresse_data_pointer, kernel_read_data_pointer -> length);
-
- free (kernel_read_data_pointer);
- free (addresse_data_pointer);
- }
-
- #endif
-
- #ifdef sysi86_stuff
- /****************************************************************************
- get_sysi86_data(g)
- *****************************************************************************/
- void
- get_sysi86_data (g)
- int g;
- {
- struct sysi86_struct *sysi86_command;
- char *sysi86_data_pointer;
-
- sysi86_command = (struct sysi86_struct *) malloc (sizeof (struct sysi86_struct));
-
- xswsrv_read (sysi86_command, sizeof (struct sysi86_struct));
-
- sysi86_data_pointer = (char *) malloc (sysi86_command -> length);
-
- sysi86 (RDUBLK, sysi86_command -> pid, (char *) sysi86_data_pointer,
- sysi86_command -> length);
-
- xswsrv_write (sysi86_data_pointer, sysi86_command -> length);
-
- free (sysi86_data_pointer);
-
- }
-
- #endif
-
- /****************************************************************************
- get_hz_data(g)
- *****************************************************************************/
- void
- get_hz_data (g)
- int g;
- {
- int hz_data_pointer;
-
- kread ((caddr_t) & hz_data_pointer,
- x[BX_HZ].n_value,
- sizeof (hz_data_pointer));
-
- xswsrv_write (&hz_data_pointer, sizeof (int));
- }
-
-
- /****************************************************************************
- quitting()
- *****************************************************************************/
- void
- quitting ()
- {
-
- int status;
-
-
- #ifdef TESTING
- gct_writelog (test_log);
- #endif
-
- sleep (1);
-
- close (g);
-
- while (waitpid (0, &status, WNOHANG) > 0)
- ;
-
- _exit (0);
- }
-
- int
- client_security_check ()
-
- {
-
- char *one_client;
- int n;
- char *space;
-
- char *client_sysname;
- int found_match = 0;
-
-
- client_sysname = (char *) malloc (sizeof (char) * 20);
- space = (char *) malloc (sizeof (char) * 2);
- strcpy (space, " ");
-
- if (found_client == 0)
- return (CLIENT_OK);
- else if (strlen (client_str) == 0)
- return (CLIENT_OK);
- else
- /*
- * Looks like we get to parse the string for our client....
- */
-
-
- {
-
- strcpy (client_sysname, client_sysuts.sysname);
-
- one_client = strtok (client_str, space);
-
- if (strcmp (one_client, client_sysname) == 0)
- {
- found_match = 1;
- }
-
- while ((found_match == 0) &&
- (one_client = strtok (NULL, space)) != NULL)
-
- {
- if (strcmp (one_client, client_sysname) == 0)
- {
- found_match = 1;
- }
- }
-
- }
-
- free (client_sysname);
- free (space);
-
- if (found_match == 1)
- return (CLIENT_OK);
- else
- return (CLIENT_NOT_OK);
-
- }
-
- void
- initialize_structures ()
- {
-
-
- int result = 0;
-
- utmps = (struct utmp *) calloc (utmps_size, sizeof (struct utmp));
-
- result = stat (utmp_file, &utmp_stat_old);
-
- /*
- if (result != 0)
- fprintf (stdout, "stat of utmp file did not work.....\n");
- */
-
- }
-
-
-
- void
- do_work ()
-
- {
-
- int done = 0;
- int ready = 99999;
-
- int answer;
- int got_permission;
- int uname_size;
- int result;
-
-
- initialize_var_data ();
-
-
-
- /*
- * The client will determine if the server and client are compatible....
- */
-
- xswsrv_write (&sync_number, sizeof (int));
-
- xswsrv_read (&answer, sizeof (int));
-
- if (answer != send_continue)
- {
- quitting ();
-
- }
- /*
- * Now lets get the name of the client to see if it is o.k. to continue...
- */
-
- else
- {
-
- xswsrv_read (&uname_size, sizeof (int));
-
- xswsrv_read (&client_sysuts, uname_size);
-
- result = client_security_check ();
-
- if (result == CLIENT_NOT_OK)
- {
- got_permission = CLIENT_NOT_OK;
- xswsrv_write (&got_permission, sizeof (int));
- quitting ();
-
- }
- else
- {
-
- got_permission = CLIENT_OK;
- xswsrv_write (&got_permission, sizeof (int));
-
- initialize_structures ();
-
-
- while (!done)
- {
-
-
- xswsrv_read (MyBuffer, sizeof (int));
-
- switch (*MyBuffer)
- {
-
- case send_user_data:
- get_user_data (g);
- break;
- case send_freemem_data:
- get_freemem_data (g);
- break;
- case send_availsmem_data:
- get_availsmem_data (g);
- break;
- case send_sysinfo_data:
- get_sysinfo_data (g);
- break;
- case send_minfo_data:
- get_minfo_data (g);
- break;
- case send_tune_data:
- get_tune_data (g);
- break;
- case send_var_data:
- get_var_data (g);
- break;
- case send_bootinfo_data:
- get_bootinfo_data (g);
- break;
- case send_bootstring_data:
- get_bootstring_data (g);
- break;
- case send_maxmem_data:
- get_maxmem_data (g);
- break;
- case send_nswap_data:
- get_nswap_data (g);
- break;
- case send_files_data:
- get_files_data (g);
- break;
- case send_inodes_data:
- get_inodes_data (g);
- break;
- case send_procs_data:
- get_procs_data (g);
- break;
- case send_regions_data:
- get_regions_data (g);
- break;
- case send_cblocks_data:
- get_cblocks_data (g);
- break;
- case send_call_data:
- get_call_data (g);
- break;
- case send_mount_data:
- get_mount_data (g);
- break;
- case send_streams_data:
- get_streams_data (g);
- break;
- case send_process_data:
- get_process_data (g);
- break;
- case send_mem_process_data:
- get_mem_process_data (g);
- break;
- #ifdef kernel_swap_mem
- case send_kernel_read_data:
- get_kernel_read_data (g);
- break;
- case send_mem_read_data:
- get_mem_read_data (g);
- break;
- case send_swap_read_data:
- get_swap_read_data (g);
- break;
- #endif
- #ifdef sysi86_stuff
- case send_sysi86_user_data:
- get_sysi86_data (g);
- break;
- #endif
- case send_hz_data:
- get_hz_data (g);
- break;
- case send_nfs_data:
- get_nfs_data (g);
- break;
- case send_nfs_available:
- get_nfs_available (g);
- break;
- case send_floppy_disk_available:
- get_floppy_disk_available (g);
- break;
- case send_scsi_disk_available:
- get_scsi_disk_available (g);
- break;
- case send_scsi_tape_available:
- get_scsi_tape_available (g);
- break;
- case send_scsi_rom_available:
- get_scsi_rom_available (g);
- break;
- case send_cart_tape_available:
- get_cart_tape_available (g);
- break;
- case send_esdi_disk_available:
- get_esdi_disk_available (g);
- break;
- case send_wd_disk_available:
- get_wd_disk_available (g);
- break;
- case send_floppy_disk_data:
- get_floppy_disk_data (g);
- break;
- case send_scsi_disk_data:
- get_scsi_disk_data (g);
- break;
- case send_scsi_tape_data:
- get_scsi_tape_data (g);
- break;
- case send_scsi_rom_data:
- get_scsi_rom_data (g);
- break;
- case send_cart_tape_data:
- get_cart_tape_data (g);
- break;
- case send_esdi_disk_data:
- get_esdi_disk_data (g);
- break;
- case send_wd_disk_data:
- get_wd_disk_data (g);
- break;
- case send_boot_time:
- get_boot_time (g);
- break;
- case send_disk_space_data:
- get_filesystem_space (g);
- break;
- case send_os_version_data:
- get_os_version_data(g);
- break;
-
- case send_quitting_data:
- quitting ();
- break;
-
- default:
- break;
-
- } /* End of Case statement */
-
- } /* End of while (!done) statement */
- }
- }
-
- }
-
- terminate_session ()
-
- {
- close (FileDescriptor);
- exit (0);
- }
-
-
- redo_general_initialization ()
- {
-
- read_defaults_file ();
-
- }
-
- /*************************************************************************
- RunProgram()
- ***************************************************************************/
- RunProgram ()
- {
-
- int i = 0;
- int len = sizeof (struct sockaddr_in);
- int status;
- int socket_send_size = 0;
- int socket_recieve_size = 0;
- int sendbuff = 0;
- int recievebuff = 0;
- int optlen = 0;
- int no_delay = 0;
- int pid;
- int temp;
- int result;
-
- struct utsname memuts;
- struct utsname sysuts;
-
- #define EINTR 4
-
-
- /*
- * If we are not inetd initialized, Put ourselves in the background and
- * act as if we are a daemon....
- */
-
- #ifndef DEBUG
-
- if (!inetd)
- {
- if (fork ())
- exit (0);
- }
-
- #endif
-
-
-
- /*
- * If we get killed, terminte the session properly....
- */
-
- setpgrp ();
-
- signal (SIGTERM, terminate_session);
- signal (SIGHUP, redo_general_initialization);
- signal (SIGINT, SIG_IGN);
- signal (SIGHUP, SIG_IGN);
- signal (SIGQUIT, SIG_IGN);
- signal (SIGCHLD, catch_child);
- signal (SIGALRM, catch_alarm);
-
- kinit (0);
- minit (0);
- sinit ();
-
- #ifdef OLDWAY
-
- init_uid_name_hash ();
-
- #endif
-
-
- if (nlist (kernel, x) == -1)
- {
- fprintf (stdout, "cant't open %s\n", kernel);
- #ifdef TESTING
- gct_writelog (test_log);
- #endif
- exit (5);
-
- }
-
- uname (&sysuts);
-
- kread ((caddr_t) & memuts, x[BX_UTSNAME].n_value,
- sizeof (struct utsname));
-
- if (memcmp ((char *) &sysuts, (char *) &memuts, sizeof (struct utsname)))
- {
- fprintf (stdout, "%s is not the booted system. Use \"-u\" option to specify the booted system.\n", kernel);
- exit (6);
- }
-
-
- MyBuffer = (int *) malloc (sizeof (int));
-
- /*
- * inetd will do the listen for us, we should use stdin for reading and
- * writing.....
- */
-
- if (!inetd)
- {
-
-
- if (listen (FileDescriptor, 5) < 0)
- perror ("listen failed :");
-
-
- for (;;)
- {
-
- while (waitpid (0, &status, WNOHANG) > 0)
- ;
-
- g = accept (FileDescriptor, &From, &len);
-
- if (g < 0)
- {
- if (errno != EINTR)
- {
- }
- continue;
- }
-
- #ifndef DEBUG
- if (fork () == 0)
- #endif
- {
- close (FileDescriptor);
- do_work ();
- } /* End of if (fork) statement */
-
- close (g);
-
- } /* End of for (;;) statement */
- }
- else
- {
-
- /*
- * Since we are inetd spwaned, read and write to stdin
- */
- g = 0;
- do_work ();
-
- }
-
- }
-